<?php
/**
 * Created by PhpStorm.
 * User: TangYijun
 * Date: 2017/3/13 0013
 * Time: 18:12
 */
namespace app\data;
use think\Model;
use think\Db;

/**
 *
 * Class Data
 * @package app\data
 */
class Data extends Model{
    protected $tableName = '';

    // 状态
    const STATUS_ON  = 1;   // 启用
    const STATUS_OFF = 2;   // 禁用

    // 推荐状态
    const TOP_NOT = 0;  // 未置顶
    const TOP_YES = 1;  // 已置顶

    // 删除状态
    const DELETE_NOT = 0;   // 未删除
    const DELETE_YES = 1;   // 已删除

    const TEMP_ARTICLE = 1; //文章模版
    const TEMP_SINGLE  = 2; //单页模型
    const TEMP_PRODUCT = 3; //项目模型

    // 角色
    const ROLE_ADMIN = 1;   // 超级管理员

    public function __construct($tableName = ''){
        $this->tableName = $tableName;
    }

    /**
     * 查询一条数据
     * @param array $where
     * @param string $field
     * @return array|false|mixed|\PDOStatement|string|Model
     */
    public function find($where = [],$field = '*'){
        return Db::name($this->tableName)->field($field)->where($where)->find();
    }

    /**
     * 返回某个字段的值
     * @param string $where
     * @param mixed|null $field
     * @return mixed
     */
    public function value($where,$field){
        return Db::name($this->tableName)->where($where)->value($field);
    }

    /**
     * 更新某个字段的值
     * @param array|string $where
     * @param mixed|string $data
     * @return int
     */
    public function setField($where,$data){
        return Db::name($this->tableName)->where($where)->setField($data);
    }

    /**
     * 连表查询单条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @return array|false|\PDOStatement|string|Model
     */
    public function joinOne($join,$where = [],$field = ''){
        return Db::name($this->tableName)->alias('a')->field($field)->join($join)->where($where)->find();
    }

    /**
     * 统计
     * @param string $where
     * @param $field
     * @return float|int
     */
    public function sum($where,$field){
        return Db::name($this->tableName)->where($where)->sum($field);
    }

    /**
     * 连表查询多条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function joinAll($join,$where=[],$field='',$order='',$limit=''){
        return Db::name($this->tableName)->alias('a')->field($field)->join($join)->where($where)->order($order)->limit($limit)->select();
    }

    /**
     * @param array $data  插入的数据
     * @return mixed 返回新增数据的自增主键
     * 插入数据的方法
     */
    public function insertData($data = []){
        return Db::name($this->tableName)->insertGetId($data);
    }

    /**
     * @param $data
     * @return int|string
     * 添加数据
     */
    public function _insert($data){
        return Db::name($this->tableName)->insert($data);
    }
    /**
     * @param array $data
     * @return int|string
     * 插入多条数据
     */
    public function insertAll($data = []){
        return Db::name($this->tableName)->insertAll($data);
    }

    /**
     * @param array $data  更新数据
     * @param array $where  更新条件可为空，如果为空则更新数据需包含主键
     * @return mixed
     * update 方法返回影响数据的条数，没修改任何数据返回 0
     */
    public function updateData($data = [],$where = []){
        if(empty($where)){
            return Db::name($this->tableName)->update($data);
        }
        return Db::name($this->tableName)->where($where)->update($data);
    }

    /**
     * @param array $where  自增条件
     * @param string $field  自增字段名称
     * @param int    $value     自增值
     * @return mixeds 方法返回影响数据的条数
     * 自增一个字段的值
     */
    public function _setInc($where = [],$field = '',$value = 1){
        return Db::name($this->tableName)->where($where)->setInc($field,$value);
    }

    /**
     * @param array $where   自减条件
     * @param string $field   自减字段名称
     * @param int    $value      自减值
     * @return mixed 方法返回影响数据的条数
     * 自减一个字段的值
     */
    public function _setDec($where = [],$field = '',$value = 1){
        return Db::name($this->tableName)->where($where)->setDec($field,$value);
    }

    /**
     * @param  int $id 主键的值
     * @return  mixed 方法返回影响数据的条数，没有删除返回 0
     * 根据主键删除一条数据
     */
    public function deleteDaPtaByPrimaryKey($id = 0){
        return Db::name($this->tableName)->delete($id);
    }

    /**
     * @param array $where  删除条件
     * @return mixed  delete 方法返回影响数据的条数，没有删除返回 0
     * 根据条件删除数据
     */
    public function deleteByWhere($where = []){
        return Db::name($this->tableName)->where($where)->delete();
    }

    /**
     * @param array $where   查询条件
     * @param int $page      每页显示的数据
     * @param string $order
     * @param array $query  搜索条件
     * @param array $join   链表
     * @param string $filed 查询字段
     * @param int $currentPage 当前页码
     * @return mixed         返回一个数据对象
     * 查询数据的方法 带分页
     */
    public function page($where = [],$order = '',$page = 20,$query = [],$join = [],$filed = '*',$currentPage=1){
        return Db::name($this->tableName)->alias('a')->field($filed)->join($join)->where($where)->order($order)->paginate($page,false,['query'=>$query,'var_page'=>'page','page'=>$currentPage]);
    }

    /**
     * @param array $where
     * @param string $order
     * @param int $page
     * @param array $query
     * @param string $filed
     * @param int $currentPage
     * @return \think\Paginator
     */
    public function pageSelf($where = [],$order = '',$page = 20,$query = [],$filed = '*',$currentPage=1){
        return Db::name($this->tableName)->alias('a')->field($filed)->where($where)->order($order)->paginate($page,false,['query'=>$query,'var_page'=>'page','page'=>$currentPage]);
    }

    /**
     * 记录后台操作日志
     * @param $action
     * @return int|string
     */
    public function addAdminLog($action)
    {
        $id = cookie('login');
        $username = Db::name('admin')->where("id = $id")->value('username');
        // 插入操作日志
        $add['uid'] = $id;
        $add['uname'] = $username;
        $add['uip'] = ip2long($_SERVER["REMOTE_ADDR"]);
        $add['log_action'] = $action;
        $add['log_time'] = time();
        return Db::name('admin_log')->insert($add);
    }
    /**
     * @param array $where  查询条件
     * @param string $field  查询字段
     * @param string $order  排序
     * @param string $limit  条数
     * @return false|\PDOStatement|string|\think\Collection  返回一个数组
     */
    public function selectData($where = [],$field = '*',$order = '',$limit = ''){
        return Db::name($this->tableName)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $alias 当前表别名
     * @param array $join 默认 INNER JOIN: 举例 [[表名1，条件1，类型1],[表名2，条件2，类型2],]
     * $join = [['auth_group_access c','a.id=c.uid','left'],];
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return mixed
     */
    public function joinData($alias='a',$join=[],$where = [],$field = '*',$order = '',$limit = ''){
        return Db::name($this->tableName)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $distinct
     * @param string $alias
     * @param array $join
     * @param $where
     * @param $field
     * @param $order
     * @param $limit
     * @return false|\PDOStatement|string|\think\Collection
     * 去掉重复
     */
    public function distinct($distinct = 'a',$alias = 'a',$join = [],$where,$field,$order,$limit){
        return Db::name($this->tableName)->distinct(true)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $where
     * @return int|string
     * 聚合函数
     */
    public function count($where){
        return Db::name($this->tableName)->where($where)->count();
    }
}